#ifndef PROTREEWIDGET_H
#define PROTREEWIDGET_H

#include <QTreeWidget>
#include <QWidget>
#include <QProgressDialog>
#include "protreethread.h"
#include <memory>
#include "opentreethread.h"
#include <QMediaPlayer>
#include <QMediaPlaylist>

class SlideShowDlg; // 前置声明

class ProTreeWidget : public QTreeWidget
{
    Q_OBJECT

public:
    ProTreeWidget(QWidget *parent = nullptr);

    void AddProToTree(const QString& name, const QString& path);

private:
    QSet<QString> _set_path; // 用来判断是否重名了
    // 右键单击某个 item 之后弹出菜单
    // 是一个基类的 QTreeWidgetItem 了类型，不然的话得包含头文件，到时候做一个动态转化就行 dynamic_cast<ProTreeItem*>(_right_btn_item)（避免互引用的问题）
    // 基类转子类得用 dynamic_cast（子类转基类是直接转化的，有隐式类型转化 --> 切片）
    QTreeWidgetItem* _right_btn_item; // 右键点击的目录
    QTreeWidgetItem* _active_item; // 活跃目录
    QTreeWidgetItem* _selected_item; // 双击选择的目录


    QAction* _action_import;
    QAction* _action_setstart;
    QAction* _action_closepro;
    QAction* _action_slideshow;
    QAction* _action_slideshow_end;

    // 关于"创建项目"和"打开项目"需要的线程和进度框都是不重用的 ---> 解耦和
    // connect 的时候，不是都连接相同的 ProTreeWidget 的 SlotUpdateProgress，SlotFinishProgress，SlotCancelProgress 槽函数和 SigCancelProgress 信号
    QProgressDialog* _dialog_progress; // 导入图片时，做一个进度的展示界面
    std::shared_ptr<ProTreeThread> _thread_create_pro; // 创建项目(目录)：加载导入图片的线程，用一个 std::shared_ptr 来管理

    QProgressDialog* _open_progressDialog;
    std::shared_ptr<OpenTreeThread> _thread_open_pro; // 打开目录(目录)：加载导入图片的线程，用一个 std::shared_ptr 来管理

    std::shared_ptr<SlideShowDlg> _slide_show_dlg; //

    // 设置音乐
    QMediaPlayer* _player;
    QMediaPlaylist * _playlist;

private slots:
    // 关于导入图片的槽函数
    void SlotItemPressed(QTreeWidgetItem* item, int column);
    void SlotImport();
    void SlotSetActive();
    void SlotClosePro();

    // 创建项目：关于显示导入进度的槽函数
    void SlotUpdateProgress(int file_count);
    void SlotFinishProgress();
    void SlotCancelProgress();

    // 打开项目：关于显示导入进度的槽函数
    void SlotUpdateOpenProgress(int file_count);
    void SlotFinishOpenProgress();
    void SlotCancelOpenProgress();

    // 双击左侧目录树实现图片切换触发的槽函数
    void SlotDoubleClickItem(QTreeWidgetItem *doubleItem, int col);

    //
    void SlotSlideShow();
public slots:
    // 在 MainWindow.cpp 中被使用，所以得使用 public slots
    void SlotOpenPro(const QString& open_path);

    // 前进后退按钮切换图片
    void SlotNextClicked(bool ckecked); // _picshow 界面点击了 nextBtn(QPushButton) 后触发的信号，一路传过来的触发的槽函数
    void SlotPreClicked(bool ckecked); // _picshow 界面点击了 previousBtn(QPushButton) 后触发的信号，一路传过来的触发的槽函数

    void SlotSetMusic(bool); // 设置音乐
    void SlotStartMusic();
    void SlotStopMusic();

signals:
    // 使用了 signals 的话，上面就得定义 Q_OBJECT 使用信号和槽的哦
    // 右击项目，执行 qmake 是得刚刚加入的 Q_OBJECT 生效
    void SigCancelProgress(); // 创建项目

    void SigCancelOpenProgress(); // 打开项目

    // proLayout 中的 ProTree 和 picLayout 中的 PicShow 的数据交互: (使用信号和槽来降低耦合)
    // 双击 proLayout 中的图片，触发 itemDoubleClicked 信号，触发 SlotDoubleClickItem 槽函数。
    // SlotDoubleClickItem 槽函数里面发射 SigUpdateSelected 信号给 _picshow(picLayout) 的 SlotSelectItem 槽函数显示双击选中的图片
    void SigUpdateSelected(const QString& path);

    void SigUpdatePic(const QString& currentPath); // 把处理好的，要显示的图片路径发送出去

    void SigClearSelected(); // 点击关闭的项目，正好是当前正在显示的项目 ---> 清空
};

#endif // PROTREEWIDGET_H
